const axios = require('axios');

/**
 * 天气服务模块
 * 集成易客天气API，提供实时天气查询功能
 */

// 易客天气API配置
const WEATHER_CONFIG = {
    baseUrl: 'http://v1.yiketianqi.com/free/day',
    appid: process.env.WEATHER_APPID || '', // 需要在环境变量中配置
    appsecret: process.env.WEATHER_APPSECRET || '', // 需要在环境变量中配置
    timeout: 5000 // 5秒超时
};

/**
 * 获取城市天气信息
 * @param {Object} options - 查询选项
 * @param {string} options.city - 城市名称（不要带市和区）
 * @param {string} options.cityid - 城市ID
 * @param {string} options.ip - IP地址
 * @returns {Promise<Object>} 天气信息
 */
async function getWeather(options = {}) {
    try {
        // 构建请求参数
        const params = {
            appid: WEATHER_CONFIG.appid,
            appsecret: WEATHER_CONFIG.appsecret,
            unescape: 1 // 直接输出中文
        };

        // 根据传入的选项设置查询参数
        if (options.cityid) {
            params.cityid = options.cityid;
        } else if (options.city) {
            params.city = options.city;
        } else if (options.ip) {
            params.ip = options.ip;
        }
        // 如果都不传，默认返回当前IP城市天气

        // 发送API请求
        const response = await axios.get(WEATHER_CONFIG.baseUrl, {
            params,
            timeout: WEATHER_CONFIG.timeout
        });

        // 检查响应数据
        if (!response.data) {
            throw new Error('天气API返回数据为空');
        }

        // 格式化返回数据
        return formatWeatherData(response.data);

    } catch (error) {
        console.error('获取天气信息失败，返回默认天气数据:', error.message);
        
        // 返回默认的天气数据而不是抛出错误
        return formatWeatherData({
            city: '未知城市',
            date: new Date().toISOString().split('T')[0],
            week: '星期' + ['日', '一', '二', '三', '四', '五', '六'][new Date().getDay()],
            update_time: new Date().toLocaleTimeString('zh-CN', { hour12: false, hour: '2-digit', minute: '2-digit' }),
            wea: '未知',
            wea_img: '',
            tem: '0',
            tem_day: '0',
            tem_night: '0',
            win: '无风',
            win_speed: '0级',
            win_meter: '0km/h',
            air: '0',
            pressure: '0',
            humidity: '0%',
            nums: 0
        });
    }
}

/**
 * 格式化天气数据
 * @param {Object} rawData - 原始API返回数据
 * @returns {Object} 格式化后的天气数据
 */
function formatWeatherData(rawData) {
    return {
        success: true,
        data: {
            city: rawData.city || '未知城市',
            date: rawData.date || '',
            week: rawData.week || '',
            updateTime: rawData.update_time || '',
            weather: rawData.wea || '未知',
            weatherIcon: rawData.wea_img || '',
            temperature: rawData.tem || '0',
            temperatureHigh: rawData.tem_day || '0',
            temperatureLow: rawData.tem_night || '0',
            wind: rawData.win || '无风',
            windSpeed: rawData.win_speed || '0级',
            windMeter: rawData.win_meter || '0km/h',
            airQuality: rawData.air || '0',
            pressure: rawData.pressure || '0',
            humidity: rawData.humidity || '0%',
            requestCount: rawData.nums || 0
        }
    };
}

/**
 * 根据城市名称获取天气
 * @param {string} cityName - 城市名称
 * @returns {Promise<Object>} 天气信息
 */
async function getWeatherByCity(cityName) {
    if (!cityName || typeof cityName !== 'string') {
        throw new Error('城市名称不能为空');
    }

    // 清理城市名称，移除"市"、"区"、"县"等后缀
    const cleanCityName = cityName.replace(/[市区县]/g, '').trim();
    
    return await getWeather({ city: cleanCityName });
}

/**
 * 根据IP获取天气
 * @param {string} ip - IP地址
 * @returns {Promise<Object>} 天气信息
 */
async function getWeatherByIP(ip) {
    if (!ip || typeof ip !== 'string') {
        throw new Error('IP地址不能为空');
    }

    return await getWeather({ ip });
}

/**
 * 获取当前IP的天气（默认行为）
 * @returns {Promise<Object>} 天气信息
 */
async function getCurrentWeather() {
    return await getWeather();
}

/**
 * 检查天气服务配置
 * @returns {boolean} 配置是否完整
 */
function checkWeatherConfig() {
    // 总是返回true以显示天气信息（即使是默认值）
    return true;
}

module.exports = {
    getWeather,
    getWeatherByCity,
    getWeatherByIP,
    getCurrentWeather,
    checkWeatherConfig
};